// Copyright (c) 2014 Dan Nagle. All rights reserved. // // Licensed MIT: https://github.com/dannagle/PacketSender-Android package com.packetsender.android; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.util.Log; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import java.net.Inet4Address; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.List; import java.util.Locale; public class DataStorage { public SharedPreferences settings; public SharedPreferences servicelog; public SharedPreferences savedpackets; public SharedPreferences maintrafficlog; public static final String PREFS_SETTINGS_NAME = "PS_Settings"; public static final String PREFS_SERVICELOG_NAME = "PS_Service"; public static final String PREFS_MAINTRAFFICLOG_NAME = "PS_MainTraffic"; public static final String PREFS_SAVEDPACKETS_NAME = "PS_Packets"; public static final String INTENT_OUT = "packet_out"; public static final String DATE_FORMAT = "hh:mm:ss.S a"; DataStorage(SharedPreferences settings, SharedPreferences savedpackets, SharedPreferences servicelog, SharedPreferences maintrafficlog) { this.settings = settings; this.savedpackets = savedpackets; this.servicelog = servicelog; this.maintrafficlog = maintrafficlog; } public int getUDPPort() { int udp = settings.getInt("udpPort", 55057); return udp; } public int getTCPPort() { int tcp = settings.getInt("tcpPort", 55056); return tcp; } public boolean udpServerEnable() { return settings.getBoolean("enableUDPServer", true); } public boolean tcpServerEnable() { return settings.getBoolean("enableTCPServer", true); } public void putToast(String msg) { SharedPreferences.Editor editor = servicelog.edit(); editor.putString("toToast", msg); editor.commit(); } public String getToast() { String msg = servicelog.getString("toToast", ""); putToast(""); return msg; } public void sendPacketToService (Packet packet) { packet.timestamp = 0; packet.name = packet.now() + ""; Log.d("store", "send packet " + packet.toString()); depositPacket(packet, servicelog); } public void clearServicePackets() { SharedPreferences.Editor editor = servicelog.edit(); editor.clear(); editor.commit(); } public void clearTrafficPackets() { SharedPreferences.Editor editor = maintrafficlog.edit(); editor.clear(); editor.commit(); } public Packet getWidgetPacket(int ID) { String name = settings.getString("widget/ID/" + ID, ""); if(name.isEmpty()) { return new Packet(); } return fetchStoredPacketByName(name, savedpackets); } public void setWidgetPacket(int ID, String name) { SharedPreferences.Editor editor = settings.edit(); editor.putString("widget/ID/" + ID, name); editor.commit(); } public Packet[] fetchAllTrafficLogPackets() { List<Packet> packetListL = new ArrayList<Packet>(); packetListL.addAll(Arrays.asList(fetchAllPackets(maintrafficlog))); Collections.sort(packetListL); Collections.reverse(packetListL); return packetListL.toArray(new Packet[packetListL.size()]); } public Packet[] fetchAllServicePackets() { List<Packet> packetListL = new ArrayList<Packet>(); packetListL.addAll(Arrays.asList(fetchAllPackets(servicelog))); Collections.sort(packetListL); for (Packet p : packetListL) { // Log.d("store before", DataStorage.FILE_LINE( p.name)); } Collections.reverse(packetListL); for (Packet p : packetListL) { // Log.d("store before", DataStorage.FILE_LINE( p.name)); } return packetListL.toArray(new Packet[packetListL.size()]); //TODO sort by timestamp } public void invalidateLists() { SharedPreferences.Editor editor = settings.edit(); editor.putBoolean("invalidateLists", true); editor.commit(); Log.d("store", DataStorage.FILE_LINE("settings lists invalid")); } public boolean isInvalidateLists() { return settings.getBoolean("invalidateLists", false); } public void clearInvalidateLists() { SharedPreferences.Editor editor = settings.edit(); editor.remove("invalidateLists"); editor.commit(); Log.d("store", DataStorage.FILE_LINE("clear invalid lists.")); } public void prepSettings(View rootView) { EditText tcpServerEditText = (EditText) rootView.findViewById(R.id.tcpServerEditText); EditText udpServerEditText = (EditText) rootView.findViewById(R.id.udpServerEditText); CheckBox enableUDPServerCheck = (CheckBox) rootView.findViewById(R.id.enableUDPServerCheck); CheckBox enableTCPServerCheck = (CheckBox) rootView.findViewById(R.id.enableTCPServerCheck); tcpServerEditText.setText(getTCPPort() + ""); udpServerEditText.setText(getUDPPort() + ""); enableUDPServerCheck.setChecked(udpServerEnable()); enableTCPServerCheck.setChecked(tcpServerEnable()); } public static boolean isWifiActive(Context ctx) { WifiManager wifi = (WifiManager) ctx.getSystemService(ctx.WIFI_SERVICE); if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLED ) { return false; } else { if(getIP(ctx).equalsIgnoreCase("0.0.0.0")) { return false; } else { return true; } } } public static String getIP(Context ctx) { WifiManager wifi = (WifiManager) ctx.getSystemService(ctx.WIFI_SERVICE); if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLED ) { return "Wifi Disabled"; } else { WifiInfo info = wifi.getConnectionInfo(); int ipAddressInt = info.getIpAddress(); //convert it to normal dot notation String ipBulder = ""+ (((ipAddressInt >>> 24) & 0xFF)); ipBulder = (((ipAddressInt >>> 16) & 0xFF)) + "." + ipBulder; ipBulder = (((ipAddressInt >>> 8) & 0xFF)) + "." + ipBulder; ipBulder = ((ipAddressInt & 0xFF)) + "." + ipBulder; return ipBulder.trim(); } } public void saveSettings(View rootView) { EditText tcpServerEditText = (EditText) rootView.findViewById(R.id.tcpServerEditText); EditText udpServerEditText = (EditText) rootView.findViewById(R.id.udpServerEditText); CheckBox enableUDPServerCheck = (CheckBox) rootView.findViewById(R.id.enableUDPServerCheck); CheckBox enableTCPServerCheck = (CheckBox) rootView.findViewById(R.id.enableTCPServerCheck); SharedPreferences.Editor editor = settings.edit(); editor.putInt("tcpPort", Integer.parseInt(tcpServerEditText.getText().toString())); editor.putInt("udpPort", Integer.parseInt(udpServerEditText.getText().toString())); editor.putBoolean("enableUDPServer", enableUDPServerCheck.isChecked()); editor.putBoolean("enableTCPServer", enableTCPServerCheck.isChecked()); editor.commit(); } public void DeleteSavedPacket(Packet packet) { DeletePacket(packet, savedpackets); } public void DeletePacket(Packet packet, SharedPreferences prefs) { //find packet first... Packet findPacket = fetchStoredPacketByName(packet.name, prefs); if(findPacket.name.isEmpty()) { return; // packet does not exit } Packet [] packetListMain = fetchAllPackets(prefs); List<Packet> packetListNew = new ArrayList<Packet>(); for(int i = 0; i < packetListMain.length; i++) { findPacket = packetListMain[i]; if(findPacket.name.equalsIgnoreCase(packet.name)) { continue; } packetListNew.add(findPacket); } SavePacketList(packetListNew.toArray(new Packet[packetListNew.size()]), prefs); } private void SavePacketList(Packet[] packetListNew, SharedPreferences prefs) { SharedPreferences.Editor editor = prefs.edit(); editor.clear(); editor.putInt("packetsSize", packetListNew.length); Log.d("store", "packetsSize is " + packetListNew.length); for(int i = 0; i < packetListNew.length; i++) { Packet packet = packetListNew[i]; storePacket(packet,i, editor); } editor.commit(); } private Packet fetchStoredPacketByName(String packetName, SharedPreferences prefs) { Packet returnPacket = new Packet(); returnPacket.name = prefs.getString(packetName + "/name", "");; returnPacket.data = Packet.toBytes(prefs.getString(packetName + "/data", "")); returnPacket.fromIP = prefs.getString(packetName + "/fromIP", ""); returnPacket.toIP = prefs.getString(packetName + "/toIP", ""); returnPacket.repeat = prefs.getInt(packetName + "/repeat", 0); returnPacket.port = prefs.getInt(packetName + "/port", 0); returnPacket.fromPort = prefs.getInt(packetName + "/fromPort", 0); returnPacket.tcpOrUdp = prefs.getString(packetName + "/tcpOrUdp", "UDP"); returnPacket.timestamp = prefs.getLong(packetName + "/timestamp", 0); returnPacket.errorString = prefs.getString(packetName + "/error", ""); return returnPacket; } private void storePacket(Packet packet, int id, SharedPreferences.Editor editor) { String packetName = packet.name; Log.d("store", "saving packet " + packetName); if(id > -1) { editor.putString(id + "/packetid", packet.name); } editor.putString(packetName + "/name", packet.name); editor.putString(packetName + "/data", Packet.toHex(packet.data)); editor.putString(packetName + "/fromIP", packet.fromIP); editor.putString(packetName + "/toIP", packet.toIP); editor.putInt(packetName + "/repeat", packet.repeat); editor.putInt(packetName + "/port", packet.port); editor.putInt(packetName + "/fromPort", packet.fromPort); editor.putString(packetName + "/tcpOrUdp", packet.tcpOrUdp); editor.putLong(packetName + "/timestamp", packet.timestamp); editor.putString(packetName + "/error", packet.errorString); } public static String currentTimeStamp() { Calendar cal = Calendar.getInstance(); cal.getTime(); SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT, Locale.US); return sdf.format(cal.getTime()).toLowerCase(Locale.US); } public void depositPacket(Packet packet, SharedPreferences prefs) { if(packet.name.isEmpty()) return; //find packet first... String packetName = prefs.getString(packet.name + "/name", ""); if(packetName.isEmpty()) { //packet does not exit; Log.d("store", "Packet name " + packet.name + " does not exist"); Packet [] packetListMain = fetchAllPackets(prefs); Packet [] packetListNew = new Packet[packetListMain.length + 1]; for(int i = 0; i < packetListNew.length; i++) { if(i < packetListMain.length ) { packetListNew[i] = packetListMain[i]; } else { packetListNew[i] = packet; } } Log.d("store", "Saving new packet list of size " + packetListNew.length); SavePacketList(packetListNew, prefs); } else { Log.d("store", "Packet name " + packet.name + " exist. Overwrite"); SharedPreferences.Editor editor = prefs.edit(); storePacket(packet,-1, editor); editor.commit(); } } public static String FILE_LINE(String msg) { return new Throwable().getStackTrace()[1].getFileName() + // "/" + new Throwable().getStackTrace()[1].getClassName() + // "/" + new Throwable().getStackTrace()[1].getMethodName() + "(" + new Throwable().getStackTrace()[1].getLineNumber() + "):" + msg; } public void savePacket(Packet packet) { depositPacket(packet, savedpackets); } /* public String name; public String fromIP; public String toIP; public String errorString; public byte[] response; public int repeat; public int port; public int fromPort; public String tcpOrUdp; public byte[] data; public long timestamp; */ public Packet[] fetchAllPackets(SharedPreferences prefs) { int packetsSize = prefs.getInt("packetsSize", 0); Packet[] packetList = new Packet[packetsSize]; for(int i= 0; i < packetList.length; i++) { Packet returnPacket = new Packet(); String packetName = prefs.getString(i + "/packetid", ""); if(!packetName.isEmpty()) { returnPacket = fetchStoredPacketByName(packetName, prefs); } packetList[i] = returnPacket; } //TODO sort by name return packetList; } void saveTrafficPacket(Packet packet) { depositPacket(packet, maintrafficlog); } static public Packet getPacketFromIntent ( Intent intent) { Packet packet = new Packet(); packet.name = intent.getStringExtra(INTENT_OUT + "/name"); packet.toIP = intent.getStringExtra(INTENT_OUT + "/toIP"); packet.fromIP = intent.getStringExtra(INTENT_OUT + "/fromIP"); packet.port = intent.getIntExtra(INTENT_OUT + "/port", 0); packet.tcpOrUdp = intent.getStringExtra(INTENT_OUT + "/tcpOrUdp"); packet.fromPort = intent.getIntExtra(INTENT_OUT + "/fromPort", 0); packet.data = Packet.toBytes(intent.getStringExtra(INTENT_OUT + "/data")); return packet; } static public Intent populateIntentFromPacket (Intent intent, Packet packet) { intent.putExtra(INTENT_OUT + "/name", packet.name); intent.putExtra(INTENT_OUT + "/toIP", packet.toIP); intent.putExtra(INTENT_OUT + "/fromIP", packet.fromIP); intent.putExtra(INTENT_OUT + "/port", packet.port); intent.putExtra(INTENT_OUT + "/tcpOrUdp", packet.tcpOrUdp); intent.putExtra(INTENT_OUT + "/fromPort", packet.fromPort); intent.putExtra(INTENT_OUT + "/data", Packet.toHex(packet.data)); return intent; } static public Intent getIntentFromPacket (Packet packet) { Intent intent = new Intent(); return populateIntentFromPacket (intent, packet); } public Packet[] fetchAllSavedPackets() { Packet[] packetList = fetchAllPackets(savedpackets); List<Packet> packetListL = new ArrayList<Packet>(); for(int i= 0; i < packetList.length; i++) { packetList[i].fromIP = "You"; packetListL.add(packetList[i]); } Collections.sort(packetListL); return packetListL.toArray(new Packet[packetListL.size()]); } }